package web.suzy.oj.service.oj.impl;

import org.springframework.stereotype.Service;
import web.suzy.oj.common.exception.StatusAccessDeniedException;
import web.suzy.oj.common.exception.StatusFailException;
import web.suzy.oj.common.exception.StatusForbiddenException;
import web.suzy.oj.common.result.ResultBean;
import web.suzy.oj.common.result.ResultStatus;
import web.suzy.oj.manager.oj.PassportManager;
import web.suzy.oj.pojo.dto.ApplyResetPasswordDTO;
import web.suzy.oj.pojo.dto.LoginDTO;
import web.suzy.oj.pojo.dto.RegisterDTO;
import web.suzy.oj.pojo.dto.ResetPasswordDTO;
import web.suzy.oj.pojo.vo.RegisterCodeVO;
import web.suzy.oj.pojo.vo.UserInfoVO;
import web.suzy.oj.service.oj.PassportService;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * YangSuzy 软件工作室
 * 类名: PassportServiceImpl
 * 描述: 用户通行证Service层服务实现类
 * 功能: ---- 待定 -----
 * ========未完成=========
 *
 * @author YangSuzy
 * Date: 2022/11/9 14:43
 */
@Service
public class PassportServiceImpl implements PassportService {
    @Resource
    private PassportManager passportManager;

    /**
     * 方法名: login
     * 描述: 用户登录方法
     *
     * @param loginDto 登录数据实体类
     * @param response 响应
     * @param request  请求
     * @return web.suzy.oj.common.result.ResultBean<web.suzy.oj.pojo.vo.UserInfoVO>
     * @date 2022/11/9 14:45
     * @auther YangSuzy
     **/
    @Override
    public ResultBean<UserInfoVO> login(LoginDTO loginDto, HttpServletResponse response, HttpServletRequest request) {
        try {
            return ResultBean.successResponse(passportManager.login(loginDto, response, request));
        } catch (StatusFailException e) {
            return ResultBean.errorResponse(e.getMessage());
        }
    }

    /**
     * 方法名: getRegisterCode
     * 描述: 向注册用户发送注册验证码
     *
     * @param email 注册用户邮箱
     * @return web.suzy.oj.common.result.ResultBean<web.suzy.oj.pojo.vo.RegisterCodeVO>
     * @date 2022/11/14 12:02
     * @auther YangSuzy
     **/
    @Override
    public ResultBean<RegisterCodeVO> getRegisterCode(String email) {
        try {
            return ResultBean.successResponse(passportManager.getRegisterCode(email));
        } catch (StatusFailException e) {
            return ResultBean.errorResponse(e.getMessage());
        } catch (StatusAccessDeniedException e) {
            return ResultBean.errorResponse(e.getMessage(), ResultStatus.ACCESS_DENIED);
        } catch (StatusForbiddenException e) {
            return ResultBean.errorResponse(e.getMessage(), ResultStatus.FORBIDDEN);
        }
    }

    /**
     * 方法名: register
     * 描述: 用户注册方法
     *
     * @param registerDto 注册用户数据传输对象
     * @return web.suzy.oj.common.result.ResultBean<java.lang.Void>
     * @date 2022/11/9 22:29
     * @auther YangSuzy
     **/
    @Override
    public ResultBean<Void> register(RegisterDTO registerDto) {
        try {
            passportManager.register(registerDto);
            return ResultBean.successResponse();
        } catch (StatusFailException e) {
            return ResultBean.errorResponse(e.getMessage());
        } catch (StatusAccessDeniedException e) {
            return ResultBean.errorResponse(e.getMessage(), ResultStatus.ACCESS_DENIED);
        }
    }

    /**
     * 方法名: applyResetPassword
     * 描述: 通过邮件发送重置密码链接
     *
     * @param applyResetPasswordDto
     * @return web.suzy.oj.common.result.ResultBean<java.lang.Void>
     * @date 2022/11/14 13:06
     * @auther YangSuzy
     **/
    @Override
    public ResultBean<Void> applyResetPassword(ApplyResetPasswordDTO applyResetPasswordDto) {
        try {
            passportManager.applyResetPassword(applyResetPasswordDto);
            return ResultBean.successResponse();
        } catch (StatusFailException e) {
            return ResultBean.errorResponse(e.getMessage());
        }
    }

    /**
     * 方法名: resetPassword
     * 描述: 密码重置方法
     *
     * @param resetPasswordDto 密码重置数据传输对象
     * @return web.suzy.oj.common.result.ResultBean<java.lang.Void>
     * @date 2022/11/9 22:32
     * @auther YangSuzy
     **/
    @Override
    public ResultBean<Void> resetPassword(ResetPasswordDTO resetPasswordDto) {
        try {
            passportManager.resetPassword(resetPasswordDto);
            return ResultBean.successResponse();
        } catch (StatusFailException e) {
            return ResultBean.errorResponse(e.getMessage());
        }
    }

    /**
     * 方法名: logout
     * 描述: 用户登出，将登录凭证从redis中删除
     *
     * @return web.suzy.oj.common.result.ResultBean<java.lang.Void>
     * @date 2022/11/15 12:49
     * @auther YangSuzy
     **/
    @Override
    public ResultBean<Void> logout() {
        passportManager.logout();
        return ResultBean.successResponse("登出成功");
    }
}
